package com.liuhouse.aspect;

import com.liuhouse.annotation.LinkMe;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

@Component
@Slf4j
@Aspect
public class LinkMeAspect {

    //这个方法 随便写  无所谓  主要是要定义切面   他是作为一个载体
    //定义切入点
    @Pointcut("@annotation(com.liuhouse.annotation.LinkMe)")
    public void link_point(){

    }

    //环绕通知 定义切面   使用 定义切入点  也就是这个切面使用的是这个切入点  只要是有LInkMe注解的方法  都会走到这个方法中
    //这都是spring的机制
    @Around("link_point()")
    public Object printLinkMe(ProceedingJoinPoint joinPoint) throws Throwable {

        //获取目标方法的所有信息
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        //获取方法的注解信息
        LinkMe linkMe = methodSignature.getMethod().getAnnotation(LinkMe.class);
        System.out.println(linkMe.info());

        //执行目标方法之前执行的
        System.out.println("环境来到的lihouse的blog");
        //执行目标方法
        Object proceed = joinPoint.proceed();
        //执行目标方法之后要执行的
        System.out.println("联系方式：17691107518,微信同步");
        //返回目标对象的返回值
        return proceed;
    }

}
